// #include <bits/stdc++.h>
// using namespace std;
// using ll=long long;
// ll n,q,x;
// void func(vector<ll>& ret,vector<ll>& dp,vector<ll>& second)
// {
//     for(int i=1;i<=ret.size();i++)
//     {
//         if(ret[i]>=dp[i-1])second[i]=dp[i-1];
//         else if(ret[i]>=second[i-1]&&ret[i]<dp[i])second[i]=ret[i];
//         else second[i]=second[i-1];
//     }
// }
// int main()
// {
//     cin>>n;
//     vector<ll> ret(n+1,0);
//     vector<ll> dp(n+1,0);//前i个数中最大的元素
//     vector<ll> second(n+1,0);//前i个数中次大的数
//     for(int i=1;i<=n;i++)
//     {
//         cin>>ret[i];
//         if(i==1)second[1]=dp[1]=ret[1];
//         dp[i]=max(ret[i],dp[i-1]);
//     }
//     func(ret,dp,second);
//     cin>>q;
//     while(q--)
//     {
//         cin>>x;
//         cout<<second[x]<<endl;    
//     }
//     return 0;
// }

//看题！看题！看题！，把题目要求看清楚
// #include <bits/stdc++.h>
// using namespace std;
// //4个一反转回原来的矩阵，2个行镜像返回原来的矩阵
// int q,n;
// void func(vector<vector<int>>& ret)
// {
//     for(auto& x:ret)
//     {
//         for(auto& s : x)
//         {
//             cout<<s<<" ";
//         }
//         cout<<endl;
//     }
// }
// int main() 
// {
//     cin>>n;
//     vector<vector<int>> ret(n,vector<int>(n,0));
//     for(int i=0;i<n;i++)
//     {
//         for(int j=0;j<n;j++)cin>>ret[i][j];
//     }
//     int counthang=0,countlie=0;
//     cin>>q;
//     while(q--)
//     {
//         int op;cin>>op;
//         if(op==1)//一次行变换和一次列变换
//         {
//             (++counthang)%=2;
//             (++countlie)%=2;
//         }
//         if(op==2)(++counthang)%=2;//一次行变换
//     }
//     if(counthang==0&&countlie==0)func(ret);
//     else if(counthang!=0&&countlie==0)
//     {
//         for(int i=0,j=ret.size()-1;i<=j;i++,j--)swap(ret[i],ret[j]);
//         func(ret);
//     }
//     else if(counthang==0&&countlie!=0)
//     {
//         for(int i=0;i<ret.size();i++)
//         {
//             for(int j=0,k=ret[i].size()-1;j<=k;j++,k--)
//                 swap(ret[i][j],ret[i][k]);
//         }
//         func(ret);
//     }
//     else if(countlie&&counthang)
//     {
//         for(int i=0,j=ret.size()-1;i<=j;i++,j--)swap(ret[i],ret[j]);
//         for(int i=0;i<ret.size();i++)
//         {
//             for(int j=0,k=ret[i].size()-1;j<=k;j++,k--)
//                 swap(ret[i][j],ret[i][k]);
//         }
//         func(ret);
//     }
//     return 0;
// }


#include <bits/stdc++.h>
using namespace std;
using ll =long long;
int n,k;
// dp[i][j]表示从前i个数中选择的总和中 mod k的值为j的最大总和
ll func(vector<ll>&ret)
{
    vector<vector<ll>> dp(n+1,vector<ll>(k,LLONG_MIN));
    dp[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<k;j++)
        {
            dp[i][j]=max(dp[i-1][j],dp[i-1][(j-ret[i]%k+k)%k]+ret[i]);
        }
    }
    return dp[n][0]>0?dp[n][0]:-1;
}
int main() 
{
    cin>>n>>k;
    vector<ll> ret(n+1,0);
    for(int i=1;i<=n;i++)cin>>ret[i];
    cout<<func(ret)<<endl;
    return 0;
}